iT邦幫忙

2022 iThome 鐵人賽

DAY 6
1
AI & Data

親手打造推薦系統系列 第 6

Day 06 - 用中研院 CKIP Transformers 做中文斷詞,台灣國語不再結巴 - 親手打造推薦系統

  • 分享至 

  • xImage
  •  

自然語言的處理常常要做斷詞,像是昨天說的做 tf-idf 。如果能夠在不失原意的情況下,把文章主要的內容詞彙找到,並刪掉沒有用的詞,後面的分析就會因為得到比較乾淨的資料,也會得到比較好的結果。

所以我們就需要一套工具,把文章丟給他,他就可以把主要的內容詞彙給找出來。之後利用 tf-idf 之類的演算法,再把文章向量化,或做其它處理。

中研院的 CKIP Transformers — 語言模型與 NLP 任務工具,就是一個可以幫助我們處理自然語言工具。

他有三大功能:

  1. 中文斷詞
  2. 詞性標註
  3. 專有名詞辨識

一般來說,如果是要處理中文斷詞的話,很多人會選結巴中文分詞,結巴用得人很多,速度快也好用。

選工具就是要選合適的。

如果要處理簡體中文的資料,我會用結巴。目前我們要分析的資料都是臺灣這邊的電影資訊,不僅僅是繁體中文,用語和文法都是台灣腔,要斷詞最好還是找懂台灣繁中的工具。

中研院的 CKIP Transformers 在訓練的時候,大量使用臺灣繁體中文的語料,所以這次我才會使用它。

另外,選它的好處有:

  1. 在處理文字的時候,不必再簡轉繁
  2. 這個工具不必建字典
  3. 它的精準度高(根據官方網站的報告)

那我們要怎麼樣把文章斷詞斷好呢?

先來看幾個斷詞又兼保留主要內容詞彙的例子

1、星際大戰第三部曲:西斯大帝的復仇

原文

經過多年激烈戰事,複製人大戰即將結束。絶地議會派歐比王將導致戰亂的主謀者繩之以法;不料,西斯勢力已悄悄深入銀河系,勢力漸大的議長白卜庭用黑暗勢力的力量,誘惑天行者安納金轉變成黑武士達斯維達,幫助他達成心願建立銀河帝國,剷除絕地武士…【星際大戰】系列電影最後一塊拼圖,喬治盧卡斯不僅要解開黑武士的影壇跨世紀謎團,更要著手打造影史最大星際戰爭。

經過斷詞以及去掉不必要的詞以後

經過 激烈 戰事 複製人 大戰 結束 絶地 議會 導致 戰亂 主謀 繩之以法 西斯 勢力 深入 銀河系 勢力 議長 黑暗 勢力 力量 誘惑 天行者 轉變成 黑武士 幫助 達成 心願 建立 銀河 帝國 剷除 絕地 武士 星際 大戰 系列 電影 最後 拼圖 解開 黑武士 影壇 世紀 謎團 著手 打造 影史 星際 戰爭

2、魔戒首部曲:魔戒現身

原文

故事由《魔戒首部曲:魔戒現身》展開,一位名叫佛羅多的年輕人,無意間得到一枚有著神秘力量的戒指,卻發現這枚戒指原來是黑暗魔王索倫所擁有。幾經波折後,他決定摧毀魔戒,以免索倫奪回去鞏固自己的勢力。巫師甘道夫、精靈、矮人、哈比人和人類於是組成魔戒遠征隊,協助佛羅多前往索倫統治的「中土世界」,將魔戒丟入末日火山摧毀。旅途中索倫派出怪獸追殺佛羅多一群人,魔戒也開始腐蝕人心,讓人產生難以抵擋的慾望,考驗著每位接觸戒指的意志力。

經過斷詞以及去掉不必要的詞以後

故事 魔戒 魔戒 現身 展開 名叫 年輕人 無意間 得到 神秘 力量 戒指 發現 戒指 黑暗 魔王 擁有 幾經 波折 決定 摧毀 魔戒 奪回 鞏固 勢力 巫師 精靈 矮人 哈比人 人類 組成 魔戒 遠征 協助 前往 統治 中土 世界 魔戒 丟入 末日 火山 摧毀 旅途 派出 怪獸 追殺 魔戒 開始 腐蝕 人心 產生 抵擋 慾望 考驗 接觸 戒指 意志力

3、美國隊長

原文

故事講述二次大戰期間,主角史提芬羅傑斯想參軍替美國打倒納粹德軍,可是他未能通過體能檢查,於是他參加了軍方一個秘密實驗計劃—重生計劃,參加者會被改造成為超級戰士,主角史提芬被改造後成為了唯一成功的實驗品,自此之後,他身穿紅、白、藍三色戰鬥服為國效力,就成為了美國隊長。

經過斷詞以及去掉不必要的詞以後

故事 講述 二次大戰 期間 主角 參軍 美國 打倒 納粹 德軍 通過 體能 檢查 參加 軍方 秘密 實驗 計劃 重生 計劃 參加 改造 成為 戰士 主角 改造 成為 成功 實驗品 之後 身穿 戰鬥服 效力 成為 美國 隊長

以上 3 個例子,有沒有發現

  1. 有感覺讀起來像快轉?
  2. 明明字變少了,但意思都能懂!

這怎麼做到的?

如何找出文章裡的主要內容詞彙?

我們要斷詞,主要目的就是要給未來處理文字的演算法好的資料。

要如何給他又好又乾淨的資料呢?以前可能會用停用詞的這種方式:把不必要的詞去掉。

但是使用停用詞表太麻煩了,因為他要建字典,但字典又建不完。

新詞一直會產生的,有沒有辦法不要用建字典的方式來解決這個問題?

仔細研究停用詞表可以發現知道,停用字其實大部分就是代名詞、助動詞、介係詞、連接詞等等。

因此,有另一個想法出現,我們是否可以不用停用詞?要了解文章大意,是否可以去除不必要詞性的詞,保留主要詞性的詞即可?。

用主要詞性的概念

文章如果只留名詞跟動詞,對於文章閱讀的影響好像問題不大。尤其是這種電影資訊的內容都是大白話,只留下名詞跟動詞,反而看起來比較清爽乾淨(例如前面的例子)。

前面的例子,我們對電影資訊做以下的處理:

  1. 只留名詞、動詞
  2. 移除專有名詞
  3. 移除一個字的詞(這是實驗出來的結果,因為是白話文以詞為單位也行,看看之前的例子,讀起來也沒問題)

既然有了概念以後,我們要怎麼實作呢?

CKIP Transformers 用法及取主要內容詞彙

1、安裝 CKIP Transformers

! pip install -U ckip-transformers

2、引入初始化 driver

from ckip_transformers import __version__
from ckip_transformers.nlp import CkipWordSegmenter, CkipPosTagger, CkipNerChunker


# Show version
print(__version__)

# Initialize drivers
print("Initializing drivers ... WS")
ws_driver = CkipWordSegmenter(model="albert-base", device=0)
print("Initializing drivers ... POS")
pos_driver = CkipPosTagger(model="albert-base", device=0)
print("Initializing drivers ... NER")
ner_driver = CkipNerChunker(model="albert-base", device=0)
print("Initializing drivers ... all done")
print()
  1. model 有其它的可以選,如 "bert-base"
  2. device=0 是使用 GPU, device=-1 是使用 CPU,不指定也可以。

3、保留主要詞彙函式

def clean(sentence_ws, sentence_pos):
  short_with_pos = []
  short_sentence = []
  stop_pos = set(['Nep', 'Nh', 'Nb']) # 這 3 種詞性不保留
  for word_ws, word_pos in zip(sentence_ws, sentence_pos):
    # 只留名詞和動詞
    is_N_or_V = word_pos.startswith("V") or word_pos.startswith("N")
    # 去掉名詞裡的某些詞性
    is_not_stop_pos = word_pos not in stop_pos
    # 只剩一個字的詞也不留
    is_not_one_charactor = not (len(word_ws) == 1)
    # 組成串列
    if is_N_or_V and is_not_stop_pos and is_not_one_charactor:
      short_with_pos.append(f"{word_ws}({word_pos})")
      short_sentence.append(f"{word_ws}")
  return (" ".join(short_sentence), " ".join(short_with_pos))

4、主函式

def main():
    text = [
        '經過多年激烈戰事,複製人大戰即將結束。絶地議會派歐比王將導致戰亂的主謀者繩之以法;不料,西斯勢力已悄悄深入銀河系,勢力漸大的議長白卜庭用黑暗勢力的力量,誘惑天行者安納金轉變成黑武士達斯維達,幫助他達成心願建立銀河帝國,剷除絕地武士…【星際大戰】系列電影最後一塊拼圖,喬治盧卡斯不僅要解開黑武士的影壇跨世紀謎團,更要著手打造影史最大星際戰爭。',
        '故事由《魔戒首部曲:魔戒現身》展開,一位名叫佛羅多的年輕人,無意間得到一枚有著神秘力量的戒指,卻發現這枚戒指原來是黑暗魔王索倫所擁有。幾經波折後,他決定摧毀魔戒,以免索倫奪回去鞏固自己的勢力。巫師甘道夫、精靈、矮人、哈比人和人類於是組成魔戒遠征隊,協助佛羅多前往索倫統治的「中土世界」,將魔戒丟入末日火山摧毀。旅途中索倫派出怪獸追殺佛羅多一群人,魔戒也開始腐蝕人心,讓人產生難以抵擋的慾望,考驗著每位接觸戒指的意志力。',
        '故事講述二次大戰期間,主角史提芬羅傑斯想參軍替美國打倒納粹德軍,可是他未能通過體能檢查,於是他參加了軍方一個秘密實驗計劃—重生計劃,參加者會被改造成為超級戰士,主角史提芬被改造後成為了唯一成功的實驗品,自此之後,他身穿紅、白、藍三色戰鬥服為國效力,就成為了美國隊長。'
    ]
    ws = ws_driver(text)
    pos = pos_driver(ws)
    ner = ner_driver(text)
    print()
    print('=====')
    for sentence, sentence_ws, sentence_pos, sentence_ner in zip(text, ws, pos, ner):
        print("原文:")
        print(sentence)
        (short, res) = clean(sentence_ws, sentence_pos)
        print("斷詞後:")
        print(short)
        print("斷詞後+詞性標注:")
        print(res)
        print('=====')
if __name__ == "__main__":
    main()

執行後輸出

=====
原文:
經過多年激烈戰事,複製人大戰即將結束。絶地議會派歐比王將導致戰亂的主謀者繩之以法;不料,西斯勢力已悄悄深入銀河系,勢力漸大的議長白卜庭用黑暗勢力的力量,誘惑天行者安納金轉變成黑武士達斯維達,幫助他達成心願建立銀河帝國,剷除絕地武士…【星際大戰】系列電影最後一塊拼圖,喬治盧卡斯不僅要解開黑武士的影壇跨世紀謎團,更要著手打造影史最大星際戰爭。
斷詞後:
經過 激烈 戰事 複製人 大戰 結束 絶地 議會 派歐比王將 導致 戰亂 主謀 繩之以法 勢力 深入 銀河系 勢力 議長 黑暗 勢力 力量 誘惑 天行 轉變成 黑武士 幫助 達成 心願 建立 銀河 帝國 剷除 絕地 武士 星際 大戰 系列 電影 最後 拼圖 解開 黑武士 影壇 世紀 謎團 著手 打造 影史 星際 戰爭
斷詞後+詞性標注:
經過(VCL) 激烈(VH) 戰事(Na) 複製人(Na) 大戰(Na) 結束(VHC) 絶地(VJ) 議會(Nc) 派歐比王將(VF) 導致(VL) 戰亂(Na) 主謀(Na) 繩之以法(VB) 勢力(Na) 深入(VCL) 銀河系(Nc) 勢力(Na) 議長(Na) 黑暗(Na) 勢力(Na) 力量(Na) 誘惑(VC) 天行(Na) 轉變成(VG) 黑武士(VH) 幫助(VC) 達成(VC) 心願(Na) 建立(VC) 銀河(Na) 帝國(Na) 剷除(VC) 絕地(Na) 武士(Na) 星際(Nc) 大戰(Na) 系列(Na) 電影(Na) 最後(Nd) 拼圖(Na) 解開(VC) 黑武士(VH) 影壇(Nc) 世紀(Na) 謎團(Na) 著手(VF) 打造(VC) 影史(Na) 星際(Nc) 戰爭(Na)
=====
原文:
故事由《魔戒首部曲:魔戒現身》展開,一位名叫佛羅多的年輕人,無意間得到一枚有著神秘力量的戒指,卻發現這枚戒指原來是黑暗魔王索倫所擁有。幾經波折後,他決定摧毀魔戒,以免索倫奪回去鞏固自己的勢力。巫師甘道夫、精靈、矮人、哈比人和人類於是組成魔戒遠征隊,協助佛羅多前往索倫統治的「中土世界」,將魔戒丟入末日火山摧毀。旅途中索倫派出怪獸追殺佛羅多一群人,魔戒也開始腐蝕人心,讓人產生難以抵擋的慾望,考驗著每位接觸戒指的意志力。
斷詞後:
故事 魔戒 魔戒 現身 展開 名叫 年輕人 無意 得到 神秘 力量 戒指 發現 戒指 黑暗 魔王 擁有 幾經 波折 決定 摧毀 魔戒 奪回去 鞏固 勢力 巫師 精靈 矮人 人類 組成 魔戒 遠征隊 協助 佛羅多 前往 索倫 統治 中土 世界 魔戒 丟入 末日 火山 摧毀 旅途 派出 怪獸 追殺 佛羅多 魔戒 開始 腐蝕 人心 產生 抵擋 慾望 考驗 接觸 戒指 意志力
斷詞後+詞性標注:
故事(Na) 魔戒(Na) 魔戒(Na) 現身(VA) 展開(VC) 名叫(VG) 年輕人(Na) 無意(VL) 得到(VJ) 神秘(VH) 力量(Na) 戒指(Na) 發現(VE) 戒指(Na) 黑暗(VH) 魔王(Na) 擁有(VJ) 幾經(VCL) 波折(Na) 決定(VE) 摧毀(VC) 魔戒(Na) 奪回去(VB) 鞏固(VHC) 勢力(Na) 巫師(Na) 精靈(Na) 矮人(Na) 人類(Na) 組成(VG) 魔戒(Na) 遠征隊(VCL) 協助(VC) 佛羅多(Nc) 前往(VCL) 索倫(Nc) 統治(VC) 中土(Nc) 世界(Nc) 魔戒(Na) 丟入(VC) 末日(Na) 火山(Na) 摧毀(VC) 旅途(Na) 派出(VC) 怪獸(Na) 追殺(VC) 佛羅多(Nc) 魔戒(Na) 開始(VL) 腐蝕(VJ) 人心(Na) 產生(VHC) 抵擋(VC) 慾望(Na) 考驗(VC) 接觸(VC) 戒指(Na) 意志力(Na)
=====
原文:
故事講述二次大戰期間,主角史提芬羅傑斯想參軍替美國打倒納粹德軍,可是他未能通過體能檢查,於是他參加了軍方一個秘密實驗計劃—重生計劃,參加者會被改造成為超級戰士,主角史提芬被改造後成為了唯一成功的實驗品,自此之後,他身穿紅、白、藍三色戰鬥服為國效力,就成為了美國隊長。
斷詞後:
故事 講述 二次大戰 期間 主角 參軍 美國 打倒 納粹 德軍 通過 體能 檢查 參加 軍方 秘密 實驗 計劃 重生 計劃 參加 改造 成為 戰士 主角 改造 成為 成功 實驗品 之後 身穿 戰鬥服 效力 成為 美國 隊長
斷詞後+詞性標注:
故事(Na) 講述(VE) 二次大戰(Na) 期間(Na) 主角(Na) 參軍(VA) 美國(Nc) 打倒(VC) 納粹(Na) 德軍(Na) 通過(VC) 體能(Na) 檢查(Nv) 參加(VC) 軍方(Na) 秘密(VH) 實驗(VE) 計劃(Na) 重生(VH) 計劃(Na) 參加(VC) 改造(VC) 成為(VG) 戰士(Na) 主角(Na) 改造(VC) 成為(VG) 成功(VH) 實驗品(Na) 之後(Nd) 身穿(VJ) 戰鬥服(Na) 效力(VB) 成為(VG) 美國(Nc) 隊長(Na)
=====

以上就是今天的內容,希望對大家有幫助。

附上 CKIP Transformers 的詞性表

A: 非謂形容詞
Caa: 對等連接詞
Cab: 連接詞,如:等等
Cba: 連接詞,如:的話
Cbb: 關聯連接詞
D: 副詞
Da: 數量副詞
Dfa: 動詞前程度副詞
Dfb: 動詞後程度副詞
Di: 時態標記
Dk: 句副詞
DM: 定量式
I: 感嘆詞
Na: 普通名詞
Nb: 專有名詞
Nc: 地方詞
Ncd: 位置詞
Nd: 時間詞
Nep: 指代定詞
Neqa: 數量定詞
Neqb: 後置數量定詞
Nes: 特指定詞
Neu: 數詞定詞
Nf: 量詞
Ng: 後置詞
Nh: 代名詞
Nv: 名物化動詞
P: 介詞
T: 語助詞
VA: 動作不及物動詞
VAC: 動作使動動詞
VB: 動作類及物動詞
VC: 動作及物動詞
VCL: 動作接地方賓語動詞
VD: 雙賓動詞
VF: 動作謂賓動詞
VE: 動作句賓動詞
VG: 分類動詞
VH: 狀態不及物動詞
VHC: 狀態使動動詞
VI: 狀態類及物動詞
VJ: 狀態及物動詞
VK: 狀態句賓動詞
VL: 狀態謂賓動詞
V_2: 有

DE: 的之得地
SHI: 是
FW: 外文

COLONCATEGORY: 冒號
COMMACATEGORY: 逗號
DASHCATEGORY: 破折號
DOTCATEGORY: 點號
ETCCATEGORY: 刪節號
EXCLAMATIONCATEGORY: 驚嘆號
PARENTHESISCATEGORY: 括號
PAUSECATEGORY: 頓號
PERIODCATEGORY: 句號
QUESTIONCATEGORY: 問號
SEMICOLONCATEGORY: 分號
SPCHANGECATEGORY: 雙直線
WHITESPACE: 空白


上一篇
Day05 - 利用 sklearn 的 TfidfVectorizer 做電影資訊的向量化 - 親手打造推薦系統
下一篇
Day 07 - 推薦得到底對不對?從關鍵字下去看看 - 親手打造推薦系統
系列文
親手打造推薦系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言